#include "encrypt.h"
#include <stdlib.h>
#include <stdio.h>

#if 0
/**
 *
 */
char *encrypt(char *origCode, int k1, int k2)
{
	int  slen = strlen(origCode);
	char *retArray = malloc(slen+1);
	int	 i = 0;

	if (NULL == retArray) {
		return NULL;
	}
	memset(retArray, 0, slen+1);
	strcpy(retArray, origCode);

	for (; i < slen; i++) {
		if (0 == i) {
			retArray[0] ^= (k1%128);
		}else if (retArray[i] != retArray[i-1]){
			retArray[i] ^= retArray[i-1];
		}
	}
	for (i = slen-1; i >= 0; i--) {
		if (slen-1 == i) {
			retArray[i] ^= (k2%128);
		}else if (retArray[i] != retArray[i+1]) {
			retArray[i] ^= retArray[i+1];
		}
	}
	return retArray;
}

/**
 *
 */
char *decrypt(char *origCode, int k1, int k2)
{
	int  slen = strlen(origCode);
	char *retArray = malloc(slen+1);
	int	 i = 0;

	if (NULL == retArray) {
		return NULL;
	}

	memset(retArray, 0, slen+1);
	strcpy(retArray, origCode);

	for (; i < slen; i++) {
		if (slen-1 == i) {
			retArray[slen-1] ^= (k2%128);
		}else if (retArray[i] != retArray[i+1]) {
			retArray[i] ^= retArray[i+1];
		}
	}
	for (i = slen-1; i >= 0; i--) {
		if (0 == i) {
			retArray[0] ^= (k1%128);
		}else if (retArray[i] != retArray[i-1]){
			retArray[i] ^= retArray[i-1];
		}
	}
	return retArray;
}
#endif


char *encrypt(char *origCode, int k1, int k2)
{
	int  slen = strlen(origCode);
	char *midArray = malloc(slen+1);
	char *retArray = malloc(slen*2 + 1);
	int	 i = 0;

	if (NULL == midArray || NULL == retArray) {
		return NULL;
	}
	memset(midArray, 0, slen+1);
	memset(retArray, 0, slen*2+1);
	strcpy(midArray, origCode);

	for (; i < slen; i++) {
		if (0 == i) {
			midArray[0] ^= (k1%128);
		}else if (midArray[i] != midArray[i-1]){
			midArray[i] ^= midArray[i-1];
		}
	}
	for (i = slen-1; i >= 0; i--) {
		if (slen-1 == i) {
			midArray[i] ^= (k2%128);
		}else if (midArray[i] != midArray[i+1]) {
			midArray[i] ^= midArray[i+1];
		}
	}
	for (i=0; i<slen; i++) {
		char d = midArray[i];
		sprintf(retArray+i*2, "%x", (d>>4));
		sprintf(retArray+i*2 + 1 , "%x", (d&0x0F));
	}
	free(midArray);
	return retArray;
}

int tolower(int c)
{
	if (c >= 'A' && c <= 'Z')
	{
		return c + 'a' - 'A';
	}
	else
	{
		return c;
	}
}

int htoi(char s[])
{
	int i;
	int n = 0;
	if (s[0] == '0' && (s[1]=='x' || s[1]=='X'))
	{
		i = 2;
	}
	else
	{
		i = 0;
	}
	for (; (s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z') || (s[i] >='A' && s[i] <= 'Z');++i)
	{
		if (tolower(s[i]) > '9')
		{
			n = 16 * n + (10 + tolower(s[i]) - 'a');
		}
		else
		{
			n = 16 * n + (tolower(s[i]) - '0');
		}
	}
	return n;
}

char *decrypt(char *origCode, int k1, int k2)
{
	int  slen = strlen(origCode);

	if(slen < 2)
		return NULL;

	char *retArray = malloc(slen/2+1);
	int	 i = 0;

	if (NULL == retArray && slen%2 != 0) {
		return NULL;
	}

	memset(retArray, 0, slen/2+1);

	for (; i < slen;) {
		char s[3] = {0};
		s[0] = origCode[i];
		s[1] = origCode[i+1];

		retArray[i/2] = htoi(s);
		i += 2;
	}

	slen /= 2;
	for (i=0; i < slen; i++) {
		if (slen-1 == i) {
			retArray[slen-1] ^= (k2%128);
		}else if (retArray[i] != retArray[i+1]) {
			retArray[i] ^= retArray[i+1];
		}
	}
	for (i = slen-1; i >= 0; i--) {
		if (0 == i) {
			retArray[0] ^= (k1%128);
		}else if (retArray[i] != retArray[i-1]){
			retArray[i] ^= retArray[i-1];
		}
	}
	return retArray;
}

